{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "9fc6205b",
   "metadata": {},
   "source": [
    "# Wikipedia\n",
    "\n",
    ">[Wikipedia](https://wikipedia.org/) is a multilingual free online encyclopedia written and maintained by a community of volunteers, known as Wikipedians, through open collaboration and using a wiki-based editing system called MediaWiki. `Wikipedia` is the largest and most-read reference work in history.\n",
    "\n",
    "This notebook shows how to retrieve wiki pages from `wikipedia.org` into the Document format that is used downstream."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "51489529-5dcd-4b86-bda6-de0a39d8ffd1",
   "metadata": {},
   "source": [
    "## Installation"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1435c804-069d-4ade-9a7b-006b97b767c1",
   "metadata": {},
   "source": [
    "First, you need to install `wikipedia` python package."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "1a737220",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "%pip install --upgrade --quiet  wikipedia"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6c15470b-a16b-4e0d-bc6a-6998bafbb5a4",
   "metadata": {},
   "source": [
    "`WikipediaRetriever` has these arguments:\n",
    "- optional `lang`: default=\"en\". Use it to search in a specific language part of Wikipedia\n",
    "- optional `load_max_docs`: default=100. Use it to limit number of downloaded documents. It takes time to download all 100 documents, so use a small number for experiments. There is a hard limit of 300 for now.\n",
    "- optional `load_all_available_meta`: default=False. By default only the most important fields downloaded: `Published` (date when document was published/last updated), `title`, `Summary`. If True, other fields also downloaded.\n",
    "\n",
    "`get_relevant_documents()` has one argument, `query`: free text which used to find documents in Wikipedia"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ae3c3d16",
   "metadata": {},
   "source": [
    "## Examples"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6fafb73b-d6ec-4822-b161-edf0aaf5224a",
   "metadata": {},
   "source": [
    "### Running retriever"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "d0e6f506",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "from langchain.retrievers import WikipediaRetriever"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "f381f642",
   "metadata": {},
   "outputs": [],
   "source": [
    "retriever = WikipediaRetriever()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "20ae1a74",
   "metadata": {},
   "outputs": [],
   "source": [
    "docs = retriever.get_relevant_documents(query=\"Титаник\", lang=\"ru\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "1d5a5088",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'title': 'Титаник',\n",
       " 'summary': '«Тита́ник» (англ. Titanic) — британский трансатлантический пассажирский пароход, второй лайнер класса «Олимпик» компании «White Star Line». Крупнейшее судно в мировой истории начала XX века. При строительстве получил номер 401.\\nВо время первого рейса, в ночь с 14 на 15 апреля 1912 года, столкнулся с айсбергом и затонул в Северной Атлантике.\\nСтроился в Белфасте на верфи «Harland & Wolff» с 1909 по 1912 год. «Титаник» был оборудован двумя четырёхцилиндровыми паровыми машинами и паровой турбиной. Вся силовая установка обладала мощностью 55 000 л. с. Лайнер мог развивать скорость до 23 узлов (42 км/ч). Его водоизмещение, превышавшее пароход-близнец «Олимпик» на 243 т, составляло 52 310 т. Корпус судна был изготовлен из стали. Трюм и нижние палубы разделялись на 16 отсеков переборками с герметичными дверями. При повреждении днища попаданию воды в отсеки препятствовало двойное дно. Журнал «Shipbuilder» назвал «Титаник» практически непотопляемым, это высказывание получило широкое распространение в прессе и среди общественности. В соответствии с устаревшими правилами «Титаник» был оснащён 20 спасательными шлюпками, суммарной вместимостью 1178 человек, что составляло лишь треть от максимальной загрузки парохода.\\nКаюты и общественные помещения «Титаника» разделялись на три класса. К услугам пассажиров первого класса были представлены плавательный бассейн, корт для игры в сквош, ресторан «À La Carte», два кафе, гимнастический зал. Во всех классах имелись обеденные и курительные салоны, открытые и закрытые променады. Наиболее роскошными и изысканными были интерьеры первого класса, выполненные в различных художественных стилях с использованием дорогих материалов, таких как красное дерево, позолота, витражное стекло, шёлк и прочие. Каюты и салоны третьего класса оформлялись максимально просто: стальные стены окрашивались в белый цвет либо обшивались деревянными панелями.\\n10 апреля 1912 года «Титаник» отправился из Саутгемптона в Нью-Йорк, в свой первый и единственный рейс. Совершив остановки во французском Шербуре и ирландском Квинстауне, лайнер вышел в Атлантический океан с 1317 пассажирами и 908 членами экипажа на борту. Планировалось прибыть в Нью-Йорк 17 апреля. Командовал судном капитан Эдвард Смит. 14 апреля радиостанция «Титаника» приняла семь ледовых предупреждений, однако лайнер продолжал двигаться почти на предельной скорости. Чтобы избежать встречи с плавучими льдами, капитан приказал идти чуть южнее привычного маршрута.\\n14 апреля в 23:39 вперёдсмотрящий Фредерик Флит доложил на капитанский мостик об айсберге прямо по курсу. Меньше чем через минуту произошло столкновение. Получив несколько пробоин, пароход начал тонуть. В шлюпки сажали в первую очередь женщин и детей. В 2:20 15 апреля, разломившись на две части, «Титаник» затонул, унеся жизни 1496 человек. 712 спасшихся человек подобрал пароход «Карпатия».\\nОбломки «Титаника» покоятся на глубине 3750 м. Впервые их обнаружила экспедиция Роберта Балларда в 1985 году. Последующие экспедиции подняли со дна тысячи артефактов. Носовая и кормовая части глубоко ушли в донный ил и находятся в ветхом состоянии, подъём их на поверхность в целости не представляется возможным.\\n\\n',\n",
       " 'source': 'https://ru.wikipedia.org/wiki/%D0%A2%D0%B8%D1%82%D0%B0%D0%BD%D0%B8%D0%BA'}"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "docs[0].metadata  # meta-information of the Document"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "c0ccd0c7-f6a6-43e7-b842-5f57afb94224",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'«Тита́ник» (англ. Titanic) — британский трансатлантический пассажирский пароход, второй лайнер класса «Олимпик» компании «White Star Line». Крупнейшее судно в мировой истории начала XX века. При строительстве получил номер 401.\\nВо время первого рейса, в ночь с 14 на 15 апреля 1912 года, столкнулся с айсбергом и затонул в Северной Атлантике.\\nСтроился в Белфасте на верфи «Harland & Wolff» с 1909 по '"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "docs[0].page_content[:400]  # a content of the Document"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2670363b-3806-4c7e-b14d-90a4d5d2a200",
   "metadata": {},
   "source": [
    "### Question Answering on facts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "583a55ab",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain.chat_models.gigachat import GigaChat\n",
    "\n",
    "giga = GigaChat(profanity=False, credentials=...)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "51a33cc9-ec42-4afc-8a2d-3bfff476aa59",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "from langchain.chains import ConversationalRetrievalChain\n",
    "from langchain_openai import ChatOpenAI\n",
    "\n",
    "qa = ConversationalRetrievalChain.from_llm(giga, retriever=retriever)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "ea537767-a8bf-4adf-ae03-b353c9145d58",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-> **Question**: В каком году утонул титаник? \n",
      "\n",
      "**Answer**: «Титаник» затонул 15 апреля 1912 года. \n",
      "\n",
      "-> **Question**: Сколько шлюпок было на борту? \n",
      "\n",
      "**Answer**: На борту Титаника находилось 22 шлюпки, включая шлюпку № 7, которая была спущена на воду последней. \n",
      "\n",
      "-> **Question**: Почему так много жертв? \n",
      "\n",
      "**Answer**: На борту Титаника находилось множество пассажиров и членов экипажа, которые погибли в результате крушения лайнера. Некоторые из причин большого количества жертв включали:\n",
      "\n",
      "1. Недостаточная подготовка экипажа: Капитан Эдвард Смит был опытным капитаном, но его команда не соответствовала требованиям безопасности. Члены экипажа не были обучены действиям при столкновении с айсбергом, а некоторые из них даже не знали, как правильно надевать спасательные жилеты. Кроме того, многие из них находились в состоянии алкогольного опьянения.\n",
      "2. Неправильное размещение пассажиров: Лайнер был перегружен людьми, что привело к тому, что на нижних палубах было недостаточно свободного пространства для эвакуации. Многие пассажиры спали на полу, что делало эвакуацию ещё сложнее.\n",
      "3. Отсутствие достаточного количества шлюпок: Шлюпки были рассчитаны только на половину пассажиров и членов экипажа, что привело к тому, что многие люди оказались в ловушке на верхних палубах и погибли.\n",
      "4. Несчастные случаи и паника: Во время эвакуации произошло несколько несчастных случаев, включая падение людей за борт и столкновения между пассажирами и членами команды. Паника, вызванная этими событиями, затруднила процесс эвакуации и увеличила количество погибших.\n",
      "5. Технические проблемы: Одной из основных технических проблем, которая привела к трагедии, было неправильное подключение электрических систем на борту. Это вызвало короткое замыкание и отключение электричества, что привело к потере освещения и отказу системы пожарной сигнализации.\n",
      "6. Ошибки навигации: Капитан Смит неправильно оценил скорость ветра и направление движения льда, что привело к тому, что судно столкнулось с айсбергом слишком близко. \n",
      "\n"
     ]
    }
   ],
   "source": [
    "questions = [\n",
    "    \"В каком году утонул титаник?\",\n",
    "    \"Сколько шлюпок было на борту?\",\n",
    "    \"Почему так много жертв?\",\n",
    "]\n",
    "chat_history = []\n",
    "\n",
    "for question in questions:\n",
    "    result = qa({\"question\": question, \"chat_history\": chat_history})\n",
    "    chat_history.append((question, result[\"answer\"]))\n",
    "    print(f\"-> **Question**: {question} \\n\")\n",
    "    print(f\"**Answer**: {result['answer']} \\n\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
